#include "protocole.h"




/**
 * \function verifIp("char* ip")
 * \brief : Verification que la chaine de caractere ip correspond a une adresse ip valide
 * \param : ip chaine de caracteres
 * \return un booleen indiquant si l'adresse ip est valide
 **/
int verifIp(char* ip){
	int i,j=0,k;
	char bloc[4];//Chaine de caractères representant un bloc entre 2 points dans l'adresse ip
	long int nb;//Valeur du bloc courant
	for(i=0;i<4;i++){
		k=0;
		while((ip[j]!='\0')&&(ip[j]!='.')&&(k<3)){//On remplit la variable bloc
			bloc[k]=ip[j];
			j++;
			k++;
		}
		bloc[k]='\0';
		if((i<3)&&(ip[j]=='\0')){//Fin de la chaine avant d'avoir eu suffisamment de caracteres
			printf("Erreur!! Une adresse IP est au format: AAA.BBB.CCC.DDD\n\n");
			return 0;
		}
		else if((i==3)&&(ip[j]!='\0')){//Il y a des caracteres apres le 4eme nombre
			printf("Erreur!! Une adresse IP est au format: AAA.BBB.CCC.DDD\n\n");
			return 0;
		}
		else if(k==0){
			printf("Erreur!! Il y a au moins un chiffre entre deux points\n\n");
			return 0;
		}
		else{
			char* err=malloc(4*sizeof(char));
			nb=strtol(bloc,&err,10);
			if(*err!='\0'){
				printf("Erreur!! Il n'y a que des chiffres et des points dans une adresse ip\n\n");
				free(err);
				return 0;
			}
			else if(nb>255){
				printf("Erreur!! Les nombres de l'adresse ip doivent etre strictement inferieurs a 255\n\n");	
				return 0;
			}
			else{
				j++;
			}
		}
	}
	return 1;
}

int checkdirexist(const char * path){
	return chdir(path);	
}


int cmd_set(char *args,char ** IP_S,int * PORT_S, char ** PATH_S){
	if(args == NULL){//Liste des options disponibles dans le programme
		printf("Options disponibles :\n\n");
		printf("ip : %s\n",*IP_S);
		printf("port : %d\n",*PORT_S);
		printf("path : %s\n",*PATH_S);
		printf("\n");
		return 0;
	}
	
	else{//Modifie la valeur d'une option
		int i=0,j=0;
		char* option=malloc(MAX_TAILLE_OPTION*sizeof(char));//Dans un premier temps on recupere le nom de l'option
		char* valeur=malloc(MAX_TAILLE_VALEUR*sizeof(char));//et sa valeur
		while((args[i]!= '=') && (!isblank(args[i]))){//Tous les caracteres avant un espace ou le symbole espace sont dans option
			if(args[i]=='\0'){
				printf("Erreur de syntaxe, pour modifier la valeur d'une option, la bonne syntaxe est les suivante : option=valeur\n\n");
				option=NULL;
				valeur=NULL;
				break;
			}
			option[i]=args[i];
			i++;
		}
		
		if(option!=NULL){
			
			option[i]='\0';
			while(((args[i]== '=') || (isblank(args[i])))&&(args[i]!='\0')){//On va jusqu'au debut du deuxieme mot	 
				i++;
			}
			if(args[i]=='\0'){
				printf("Erreur de syntaxe, pour modifier la valeur d'une option, la bonne syntaxe est les suivante : option=valeur\n\n");
				valeur=NULL;
			}
			
			if(valeur!=NULL){
				while((args[i]!='\0')&&(!isblank(args[i]))){//Lecture de la valeur
					valeur[j]=args[i];
					i++;
					j++;
				}
				valeur[j]='\0';
			}
		}
		
		if((option!=NULL)&&(valeur!=NULL)){
			if(strcasecmp(option,"ip")==0){
				if(verifIp(valeur)){
					*IP_S=valeur;
					printf("Votre nouvelle adresse ip est : %s\n",*IP_S);
					return 0;
				}
			}
			else if(strcasecmp(option,"port")==0){
				if(!atoi(valeur)){
					printf("Vous devez entrer une valeur entiere\n\n");
				}
				else{
					*PORT_S = atoi(valeur);
					printf("Votre nouveau port est : %d\n",*PORT_S);
					return 0;
				}
			}
			else if(strcasecmp(option,"path")==0){
				if ((checkdirexist(valeur))==-1) {
					printf("Chemin incorrect !\n");
				}
				else{
					*PATH_S=valeur;
					printf("Votre nouveau chemin pour les fichiers est : %s\n",*PATH_S);
					return 1;
				}
			}
			else{
				printf("L'option que vous voulez modifier n'existe pas\n");
			}
		}
	}
	return -1;
}


int decomposer_buff(const char* buf,char* cmd,char* param){
	int i=0;
	sscanf(buf, "%s", cmd);
	while((buf[i]!='\0')&&(!isblank(buf[i]))){//On va jusqu'a la fin du premier mot ou au premier espace
		i++;
	}
	while((buf[i]!='\0')&&(isblank(buf[i]))){//On va jusqu'a la fin des espaces s'il y en a
		i++;
	}
	if(buf[i]!='\0'){//On copie tout ce qui suit le premier mot dans param
		strcpy(param,&buf[i]);
	}
	else{
		return 0;
	}
	return 1;
}


